package com.zhihao.zhihaopicturebackend.manager.auth;

import com.zhihao.zhihaopicturebackend.model.entity.ServicePicture;
import com.zhihao.zhihaopicturebackend.model.entity.ServiceSpace;
import com.zhihao.zhihaopicturebackend.model.entity.ServiceSpaceUser;
import lombok.Data;

/**
 * SpaceUserAuthContext
 *  表示用户在特定空间内的授权上下文，包括关联的图片、空间和用户信息。
 *
 *  公共空间、私人空间、团队空间的统一鉴权：
 *      1. 公共空间和用户空间的图片本项目中都是存储在一个service_picture表中，同时公共空间的标识space_id是NULL
 *      2. 鉴权的常规思路：
 *          仅获取到 用户userId是不足以完成本项目中的团队空间的鉴权操作的，因为需要校验的是‘某个用户’在‘某个特定团队空间’中角色/权限
 *          同时 有了spaceId用户空间id和UserId 在对公共空间的图片操作时也是不够的，因为公共空间的spaceId为NULL，只能获取到不用sa-token的userType
 *              并不能关联上service_space表中的spaceId，进而不能获取到user在space的role及permissions
 *      3. 针对上述问题，解决方案如下：
 *          1） 注解式鉴权是在方法执行之前执行，此时无法从接口拿到入参，只能通过servlet的HttpRequest对象中获取到需要的参数，从而重写对应的getPermissions方法
 *          2） 由于不同的接口中都有相同的id参数，但是对于不同业务接口的id参数代表的意义不同，id-用户id、图片id、空间用户关联id...
 *               所以此时采用http请求中getRequestUrl类似方法获取到接口请求参数(不同业务的接口RequestMapping往往不同)来区分id究竟是哪个id
 *          3） 重写sa-token最核心的方法-根据userId和LoginType多账号标识，获取到userId的角色/权限---供sa-token框架后续鉴权调用
 */
@Data
public class SpaceUserAuthContext {

    /**
     * 临时参数，不同请求对应的 id 可能不同
     */
    private Long id;

    /**
     * 图片 ID
     */
    private Long pictureId;

    /**
     * 空间 ID
     */
    private Long spaceId;

    /**
     * 空间用户 ID
     */
    private Long spaceUserId;

    /**
     * 图片信息
     */
    private ServicePicture picture;

    /**
     * 空间信息
     */
    private ServiceSpace space;

    /**
     * 空间用户信息
     */
    private ServiceSpaceUser spaceUser;
}